/**
 * 全局错误处理中间件
 * 用于捕获和处理应用中的所有错误
 */
const ApiResponse = require('../utils/response');
const CustomException = require('../utils/customException');
const ResultCodeEnum = require('../utils/resultCodeEnum');

/**
 * 错误处理中间件
 * @param {Error} err - 错误对象
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 * @param {Function} next - Express下一个中间件函数
 */
function errorHandler(err, req, res, next) {
  // 记录错误
  console.error('错误:', err.message);
  console.error(err.stack);

  // 自定义异常处理
  if (err instanceof CustomException) {
    // 处理自定义异常
    return res.status(Number(err.code) || 500).json(ApiResponse.error(err.code, err.msg));
  }

  if (err.name === 'ValidationError') {
    // Sequelize验证错误
    const validationErrors = {};
    for (const field in err.errors) {
      validationErrors[field] = err.errors[field].message;
    }
    return res.status(400).json(ApiResponse.paramError('验证失败', validationErrors));
  }

  if (err.name === 'SequelizeDatabaseError') {
    // 数据库错误
    return res.status(500).json(ApiResponse.error('500', '数据库操作错误: ' + err.message));
  }

  if (err.name === 'SequelizeUniqueConstraintError') {
    // 唯一约束错误
    return res.status(400).json(ApiResponse.paramError('该记录已存在: ' + err.message));
  }

  if (err.name === 'JsonWebTokenError') {
    // JWT错误
    return res.status(401).json(ApiResponse.unauthorized(ResultCodeEnum.TOKEN_INVALID_ERROR.msg));
  }

  if (err.name === 'TokenExpiredError') {
    // JWT过期错误
    return res.status(401).json(ApiResponse.unauthorized(ResultCodeEnum.TOKEN_EXPIRED_ERROR.msg));
  }

  if (err.message === '分类不存在') {
    // 分类不存在错误
    return res.status(404).json(ApiResponse.error('404', err.message));
  }

  // 默认错误响应
  const statusCode = err.statusCode || 500;
  const message = err.message || ResultCodeEnum.SYSTEM_ERROR.msg;

  res.status(statusCode).json(ApiResponse.error(statusCode.toString(), message));
}

module.exports = errorHandler;